﻿using System;

// 生成exe命令: dotnet publish -r win10-x64 /p:PublishSingleFile=true
// namespace 命名空间在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。
namespace FristApp
{
    class Program
    {
        /**
         * 程序执行的默认入口点
         */
        static void Main(string[] args)
        {
            // Test1();
            // Sceond.Project.test();
            // Sceond.Project.test2();
            // Sceond.Project.test3();
            // Sceond.Project.test4();
            // Sceond.Project.test5();
            // Sceond.Project.test6();
            // Sceond.Project.Test7();
            // Sceond.Project.Test8();
            // Sceond.Project.Test9();
            // Sceond.Project.Test10();
            // Sceond.Project.Test11();
            // Third.Project.Test1();
            // Third.Project.Test2();
            // Third.Project.Test3();
            // Third.Project.Test4();
            // Third.Project.Test5();
            // Third.Project.Test6();
            // Third.Project.Test7();
            // Third.Project.Test8();
            // Four.Program.Test1();
            // Four.Program.Test2();
            // Four.Program.Test3();
            // Four.Program.Test4();
            // Four.Program.Test5();
            // Four.Program.Test6();
            // Four.Program.Test7();
            Four.Program.Test8();
        }

        private static void Test1()
        {
            // 控制台输出字符串 "Hello World!"
            Console.WriteLine("Hello World!");

            // 声明 int 类型变量x 并初始化
            int x = 12 * 30;
            Console.WriteLine(x);
            // 修改x的值
            x = 73;
            Console.WriteLine(x);

            // 声明一个常量, 常量的值不能修改
            const int y = 360;
            Console.WriteLine(333 + y.ToString()); // 333360


            // 调用 FeetToInches 方法并输出
            Console.WriteLine(FeetToInches(12));

            // User 实例
            var user = new User(22, "afra55");
            Console.WriteLine(user.SingASong());
            user.age = 133;
            // 引用类型变量赋值只会复制引用
            var user2 = user;
            user2.age = 33;
            user2.name = "Bfra55";
            Console.WriteLine(user2.SingASong());
            Console.WriteLine(user.SingASong());

            // 值类型实例
            var myStruct = new MyStruct();
            myStruct.age = 22;
            Console.WriteLine(myStruct.age); // 22
            // 值类型赋值是值的复制而不是引用
            var myStruct2 = myStruct;
            myStruct2.age = 100;
            Console.WriteLine(myStruct2.age); // 100
            Console.WriteLine(myStruct.age); // 22
        }

        static int FeetToInches(int feet)
        {
            int inches = feet * 12;
            return inches;
        }
    }

    // 自定义类型
    class User
    {
        public int age;
        public string name;

        /**
         * 构造方法
         */
        public User(int age, string name)
        {
            this.age = age;
            this.name = name;
        }

        // public 将方法公开
        public string SingASong()
        {
            return $"{name}({age}) sing a song {"{}"}";
        }
    }

    // struct 定义了值类型
    public struct MyStruct
    {
        public int age;
    }

}